#------------------------------------------------------
# 指定CMake的最小工作版本
cmake_minimum_required(VERSION 3.4)

# 指定该CMake工程的名称(给工程起名字)，
# 同时，project()这条命令所在的目录（或者说包含project这个命令的.txt文件所在的目录），即被cmake认为是工程的根目录。
# VERSION用于指定版本，可不带
project(G4Basic VERSION 1.0)

# 从操作系统中找到Geant4这个库，找到后通过CMake自带的FindGeant4.cmake模块文件进行配置。
# 如果成功配置，则会生成以下变量：
#   Geant4_INCLUDE_DIRS：Geant4头文件的路径列表。
#   Geant4_LIBRARIES：Geant4库文件的路径列表。
#   Geant4_DEFINITIONS：Geant4的定义，用于在编译器中设置预处理器宏。
#   REQUIRED表示这个库是必须的，如果找不到这个库，就没必要编译构建了。
#   如果后续还要用到可视化，在要加上参数 ui_all vis_all
find_package(Geant4 REQUIRED ui_all vis_all)

# 添加一个辅助G4编译的CMake规则，此规则由G4提供。
#在CMake中，include命令用于包含外部文件，而include(${Geant4_USE_FILE})则是包含一个由Geant4提供的CMake模块文件。
# ${Geant4_USE_FILE}是一个变量，它的值是指向Geant4Config.cmake文件的路径。Geant4Config.cmake是由Geant4提供的一个CMake模块文件，用于配置Geant4应用程序的编译选项。
# 通过包含${Geant4_USE_FILE}，您可以轻松地将Geant4的编译选项添加到您的项目中。这些编译选项可能包括编译器标志、头文件目录和库文件目录等。
# 具体而言，include(${Geant4_USE_FILE})会执行以下操作：
#    将Geant4Config.cmake模块文件包含到您的CMake项目中。
#    该模块文件会自动配置您的项目，包括设置编译器标志、包含目录和链接库等。
include(${Geant4_USE_FILE})

# 添加库文件的路径，告知gcc编译器可以在这个目录下查找头文件
include_directories(${PROJECT_SOURCE_DIR}/include)

# 将工程中我们自己编写的.cc源文件，打包成一个变量（文件包），这个变量（文件包）的名字，命名为sources
# 其中，file()是文件操作命令，GLOB参数这表示查找源码文件
file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc)
# 将工程中我们自己编写的.hh的头文件，也打包成一个文件包，这个头文件的文件包，命名为headers
file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.hh)

# 添加待编译文件,并指定编译出来的可自行文件的名称。添加的待编译的文件有main函数所在的cc文件，
# 即G4Basic，还有include文件夹下的所有.hh文件，这部分文件已经打包为headers，还有src文件夹
# 下的所有文件，这部分文件已经打包为soueces。打包好的文件可以直接把这一包添加进去。
add_executable(G4Basic G4Basic.cc ${sources} ${headers})

# 把Geant4的用户要用到的头文件连接到可自行文件里来。
target_link_libraries(G4Basic ${Geant4_LIBRARIES})

# 关于Geant4的链接编译规则结束了，还有一些我们自己编写的.mac的辅助操作文件也要进行一些操作
# 我们的编译和构建和程序的运行，都是在${PROJECT_SOURCE_DIR}/build文件夹中进行的，而.mac文件则是在工程目录中，
# 程序在运行时，在build文件夹中找不到.mac文件会报错，所以要将文件打包拷贝到build中，这时要用到文件操作，而为了是操作更为灵活
# G4的鼓呐喊选择使用了set命令，而没有选择file命令。

# set是创建变量的命令，创建一个名为 EXAMPLEB1_SCRIPTS 的变量，并将.in,.out,.mac等文件作为变量的值，说白了还是一个文件打包的步骤。
set(EXAMPLEB1_SCRIPTS
#  exampleB1.in
#  exampleB1.out
#  init_vis.mac
#  run1.mac
  auto.mac
  vis.mac
)

# 打包文文件，就要将文件拷贝到build文件夹中，这个步骤可以用configure_file来实现，同时带上COPYONLY参数，表示只进行文件拷贝，不做其他操作。
# 但是文件包中，可能不止一个文件，所以要用到一个类似C语言中for循环的操作，在cmake语法中，是foreach()

# 这条命令是表示遍历${EXAMPLEB1_SCRIPTS}的文件，依次存到_script变量中，并执行一次拷贝
foreach(_script ${EXAMPLEB1_SCRIPTS})
  configure_file(
    ${PROJECT_SOURCE_DIR}/${_script}
    ${PROJECT_BINARY_DIR}/${_script}
    COPYONLY
    )
endforeach()

# 至此，编译规则已经全部结束了，但是还有一些善后的工作，在可自行文件运行的过程中，会产生一些中间文件，这些中间文件要统一存放，
# 此时，可以用install命令，创建一个bin文件夹，将相关的中间文件都放在里边。
install(TARGETS G4Basic DESTINATION bin)

# Geant4官方，为了能让B1例程更方便的集成到别的地方，还做了一点巧妙的设计。
# 引入了add_custom_target命令，在 Geant4 中，add_custom_target() 命令是 CMake 中用于创建自定义构建目标的命令。
# 该命令创建一个自定义的构建目标 B1，它依赖于 exampleB1 目标。执行 B1 构建目标时，将自动构建 exampleB1 目标，从而生成所需的输出文件。

# 这种方式允许用户使用简单的 make 命令来构建所需的目标，而无需显式指定每个目标。
# 此外，通过将 B1 构建目标与依赖的目标 exampleB1 分开，用户可以更容易地将其与其他构建目标（例如测试）集成在一起。
add_custom_target(B1 DEPENDS G4Basic)

